// 引入axios库
import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store/'
import router from '@/router'
// 创建实例
const service = axios.create({
// 配置基准路径，最终 url = baseURL + 接口url
  baseURL: process.env.VUE_APP_BASE_API,
  // 超时设定（如果七个球时间超过5000ms，会报错）
  timeout: 5000 // request timeout
})

// 请求拦截器（空的）
service.interceptors.request.use(config => {
  // 如果要主动 token 超市，不能直接注入
  // 判断完是否有token 之后，还需要判断是否超时
  if (store.getters.token) {
    const timeout = 500000
    const loginTime = localStorage.getItem('loginTime')
    const now = Date.now()
    const isTimeout = now - loginTime > timeout
    if (isTimeout) {
    // 如果以及超时，不能发送请求
    // 需要退出
    // 可以将其封装在vuex中进行显示
      store.commit('user/removeToken')
      store.commit('user/removeProfile')
      router.push('/login')
      return Promise.reject(new Error('token超时（主动介入）'))
    }
    // 标准写法记得加上标记'Bearer ',注意有空格
    config.headers.Authorization = 'Bearer ' + store.getters.token
  }
  return config
})

// 响应拦截器（空的）
service.interceptors.response.use(res => {
  console.log('拦截器14', res)
  // res为响应部分的数据，里头保存有token，请求状态的描述
  const { data, message, success } = res.data
  console.log(data, message)
  if (success) {
    console.log('请求完全成功')
    return data
  } else {
    console.log('数据层面失败')
    Message.error(message)
    // 没有完全拦截掉，这时候需要通过promise.reject（）终止promise异步操作，直接抛出错误，这样就可以在user页面终止掉promise操作
    return Promise.reject(new Error(message))
  }
}, error => {
  console.log('网络上出错')
  console.dir(error)
  // 发生401网络请求层面的错误，需要对其做被动出错处理
  if (error.response && error.response.data.code === 10002) {
    store.commit('user/removeToken')
    store.commit('user/removeProfile')
    router.push('/login')
  }
  Message.error(error.message)
  return Promise.reject(error)
})

export default service
